package cn.itsource.controller.file;

import cn.hutool.core.io.file.FileNameUtil;
import cn.itsource.util.AjaxResult;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

@RestController //@Contorller和@ResponseBody（所有的方法都返回json格式）
@RequestMapping("/html/file") //公共路径
public class FileController {

    /**
     * 查询分页数据
     * @return
     * @RequestBody：前后台分离的项目，接受对象就得用它
     *
     * MultipartFile:springmvc提供上传文件接受用的对象
     * file : 文件流
     *
     */

    @PostMapping("/ossUpload")
    public AjaxResult ossUpload(@RequestParam("file") MultipartFile file){
        //1.调用
        // Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。
        String endpoint = "oss-cn-hangzhou.aliyuncs.com";
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        String accessKeyId = "LTAI5tFdPf6sUHbb3V4gHa8V";
        String accessKeySecret = "7WuXzHvpmFEM3q7Ez9E49xmNn2dV5w";
        // 填写Bucket名称，例如examplebucket。
        String bucketName = "lg-java";
        // 填写Object完整路径，完整路径中不能包含Bucket名称，例如exampledir/exampleobject.txt。
        /**
         * 1.文件名不能重复    随机数：时间戳，uuid
         * 2.文件后缀名和原始类型一致   获取到真实的后缀
         * 文件名 = 随机数 + “.” + suffix
         */
        //todo
        String originalFilename = file.getOriginalFilename(); //index.png
        String suffix = FileNameUtil.getSuffix(originalFilename);//png

        //String objectName = IdUtil.fastSimpleUUID() + "."+suffix;
        String fileName = System.currentTimeMillis() + "."+suffix;

        // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件流。
        //String filePath= "E:\\photo\\index.png";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // todo 流从MultipartFile里面获取
            InputStream inputStream = file.getInputStream();
            // 创建PutObject请求。
            ossClient.putObject(bucketName, fileName, inputStream);
        } catch (OSSException oe) {
            System.out.println("Error Message:" + oe.getErrorMessage());
        } catch (ClientException ce) {
            System.out.println("Error Message:" + ce.getMessage());
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        //https://java0605.oss-cn-hangzhou.aliyuncs.com/1662434057750.jpg
        //拼接图片的oss里面对应的url
        String url = "https://"+bucketName+"."+endpoint+"/"+fileName;
        //2.通过统一对象返回数据
        return AjaxResult.Success(url);
    }
}
